package org.aerie.forest.core.genericity;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import org.aerie.forest.core.brick.exception.custom.runtime.GenericityClassException;

/**
 * @description 包含泛型的类【这里接口的方法无法final,抽象类可以实现final，但是单继承】
 * @param <T> 泛型
 *
 * @author quark
 * @organization aerie
 * @date 2020年2月27日 下午5:05:17
 * @version 1.2.0
 */
public interface ContainsGenericity<T> {

	/**
	 * @description 获得泛型的类型
	 * @return 类型
	 *
	 * @date 2020年2月27日 下午5:05:29
	 * @version 1.2.0
	 */
	@SuppressWarnings({ "unchecked", "restriction" })
	default Class<T> getGenericityZclass() {
		Type type = ((ParameterizedType) (getClass().getGenericSuperclass())).getActualTypeArguments()[0];
		Class<?> zClass;
		if ((zClass = type.getClass()) == sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.class) {
			return (Class<T>) ((sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl)type).getRawType();
		}else if (zClass == Class.class) {
			return (Class<T>) type;
		}else {
			throw new GenericityClassException();
		}
	}
}
